package com.zenithmind.coding.pojo.vo;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 竞赛视图对象
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Data
@Schema(description = "竞赛视图对象")
public class ContestVO {

    /**
     * 竞赛ID
     */
    @Schema(description = "竞赛ID")
    private String id;

    /**
     * 竞赛标题
     */
    @Schema(description = "竞赛标题")
    private String title;

    /**
     * 竞赛描述
     */
    @Schema(description = "竞赛描述")
    private String description;

    /**
     * 竞赛规则
     */
    @Schema(description = "竞赛规则")
    private String rules;

    /**
     * 竞赛类型（1-个人赛，2-团队赛，3-练习赛，4-正式赛）
     */
    @Schema(description = "竞赛类型（1-个人赛，2-团队赛，3-练习赛，4-正式赛）")
    private Integer type;

    /**
     * 竞赛类型名称
     */
    @Schema(description = "竞赛类型名称")
    private String typeName;

    /**
     * 竞赛模式（1-ACM模式，2-OI模式，3-IOI模式）
     */
    @Schema(description = "竞赛模式（1-ACM模式，2-OI模式，3-IOI模式）")
    private Integer mode;

    /**
     * 竞赛模式名称
     */
    @Schema(description = "竞赛模式名称")
    private String modeName;

    /**
     * 竞赛状态（0-未开始，1-进行中，2-已结束，3-已取消）
     */
    @Schema(description = "竞赛状态（0-未开始，1-进行中，2-已结束，3-已取消）")
    private Integer status;

    /**
     * 竞赛状态名称
     */
    @Schema(description = "竞赛状态名称")
    private String statusName;

    /**
     * 开始时间
     */
    @Schema(description = "开始时间")
    private LocalDateTime startTime;

    /**
     * 结束时间
     */
    @Schema(description = "结束时间")
    private LocalDateTime endTime;

    /**
     * 持续时间（分钟）
     */
    @Schema(description = "持续时间（分钟）")
    private Integer duration;

    /**
     * 最大参与人数
     */
    @Schema(description = "最大参与人数")
    private Integer maxParticipants;

    /**
     * 当前参与人数
     */
    @Schema(description = "当前参与人数")
    private Integer currentParticipants;

    /**
     * 是否公开（0-私有，1-公开）
     */
    @Schema(description = "是否公开（0-私有，1-公开）")
    private Integer isPublic;

    /**
     * 是否需要密码（0-否，1-是）
     */
    @Schema(description = "是否需要密码（0-否，1-是）")
    private Integer needPassword;

    /**
     * 奖励设置（JSON格式）
     */
    @Schema(description = "奖励设置（JSON格式）")
    private String rewards;

    /**
     * 竞赛标签（JSON格式）
     */
    @Schema(description = "竞赛标签（JSON格式）")
    private String tags;

    /**
     * 竞赛标签列表
     */
    @Schema(description = "竞赛标签列表")
    private List<String> tagList;

    /**
     * 竞赛封面图片URL
     */
    @Schema(description = "竞赛封面图片URL")
    private String coverImage;

    /**
     * 创建者ID
     */
    @Schema(description = "创建者ID")
    private String creatorId;

    /**
     * 创建者名称
     */
    @Schema(description = "创建者名称")
    private String creatorName;

    /**
     * 是否允许查看他人代码（0-否，1-是）
     */
    @Schema(description = "是否允许查看他人代码（0-否，1-是）")
    private Integer allowViewOthersCode;

    /**
     * 是否允许讨论（0-否，1-是）
     */
    @Schema(description = "是否允许讨论（0-否，1-是）")
    private Integer allowDiscussion;

    /**
     * 是否实时排行榜（0-否，1-是）
     */
    @Schema(description = "是否实时排行榜（0-否，1-是）")
    private Integer realtimeRanking;

    /**
     * 排序值
     */
    @Schema(description = "排序值")
    private Integer sortOrder;

    /**
     * 竞赛问题列表
     */
    @Schema(description = "竞赛问题列表")
    private List<ProblemVO> problems;

    /**
     * 竞赛问题数量
     */
    @Schema(description = "竞赛问题数量")
    private Integer problemCount;

    /**
     * 用户是否已参加
     */
    @Schema(description = "用户是否已参加")
    private Boolean userJoined;

    /**
     * 用户在竞赛中的排名
     */
    @Schema(description = "用户在竞赛中的排名")
    private Integer userRank;

    /**
     * 用户在竞赛中的得分
     */
    @Schema(description = "用户在竞赛中的得分")
    private Integer userScore;

    /**
     * 用户在竞赛中解决的问题数
     */
    @Schema(description = "用户在竞赛中解决的问题数")
    private Integer userSolvedCount;

    /**
     * 剩余时间（分钟）
     */
    @Schema(description = "剩余时间（分钟）")
    private Long remainingTime;

    /**
     * 是否可以参加
     */
    @Schema(description = "是否可以参加")
    private Boolean canJoin;

    /**
     * 不能参加的原因
     */
    @Schema(description = "不能参加的原因")
    private String cannotJoinReason;

    /**
     * 创建时间
     */
    @Schema(description = "创建时间")
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @Schema(description = "更新时间")
    private LocalDateTime updateTime;

    /**
     * 获取竞赛类型名称
     */
    public String getTypeName() {
        if (type == null) return "未知";
        return switch (type) {
            case 1 -> "个人赛";
            case 2 -> "团队赛";
            case 3 -> "练习赛";
            case 4 -> "正式赛";
            default -> "未知";
        };
    }

    /**
     * 获取竞赛模式名称
     */
    public String getModeName() {
        if (mode == null) return "未知";
        return switch (mode) {
            case 1 -> "ACM模式";
            case 2 -> "OI模式";
            case 3 -> "IOI模式";
            default -> "未知";
        };
    }

    /**
     * 获取竞赛状态名称
     */
    public String getStatusName() {
        if (status == null) return "未知";
        return switch (status) {
            case 0 -> "未开始";
            case 1 -> "进行中";
            case 2 -> "已结束";
            case 3 -> "已取消";
            default -> "未知";
        };
    }

    /**
     * 检查竞赛是否进行中
     */
    public boolean isRunning() {
        return Integer.valueOf(1).equals(this.status);
    }

    /**
     * 检查竞赛是否已结束
     */
    public boolean isFinished() {
        return Integer.valueOf(2).equals(this.status);
    }

    /**
     * 检查竞赛是否已取消
     */
    public boolean isCancelled() {
        return Integer.valueOf(3).equals(this.status);
    }

    /**
     * 检查是否可以查看排行榜
     */
    public boolean canViewRanking() {
        return Integer.valueOf(1).equals(this.realtimeRanking) || isFinished();
    }
}
